import java.util.regex.Matcher;
import java.util.regex.Pattern;

import ca.etsmtl.log.util.IDLogger;

/**
 * Cette classe sert uniquement a la decomposition de la chaine de caracteres
 * recue par le serveur. La chaine est decomposee en elements qui sont stocke dans
 * un tableau selon un ordre precis et constant.
 * @author Simon Castro
 *
 */
public class Parser {
	private String coordonnees;
	private String nseq;
	private String type;
	private String[] coordonneesSplit;
	private String[] infos_formes;
	private IDLogger logger;
	
	public Parser(){
		logger = IDLogger.getInstance();
	}
	/**
	 * 
	 * @param ligne
	 * @return retourne un tableau contenant les coordonnees des formes a afficher
	 */
	public String[] getInfosFormes(String ligne){
	
		extractAll(ligne);
		//sert a la validation
		logger.logID(Integer.parseInt(nseq.trim()));
		
		splitCoordonnees();
		/*rempli le tableau a retourner qui contient dans l'ordre:
		 * type x1 x2 y1 y2 nseq 
		 */
		remplir_infos();
		return this.infos_formes;
	}

	/**
	 * 
	 * @param s la string contenant les infos recue du serveur
	 */
	private void extractAll(String s){
		/*
		 * Ici je me suis inspire de l'exemple donne dans la description du tp
		 * et disponible a cette adresse: https://cours.etsmtl.ca/log121/private/lab/lab1/expressionsRationnelles.shtml
		 */
		Pattern p = Pattern.compile("(.*)<(.*)>(.*)</\\2>");
		Matcher m = p.matcher(s);
		
		while(m.find()){
			nseq = m.group(1);
			type = m.group(2);
			coordonnees = m.group(3);
		}
	}
	
	/**
	 * la String coordonnees contient maintenant les positions xy separees par des espaces
	 * On les place dans un tableau de String en utilisant l'espace blanc comme separateur
	 */
	private void splitCoordonnees(){
		coordonneesSplit = coordonnees.split("\\s");
		
		//dans le tableau, la position 0 est toujours vide, on va s'en servir et mettre le type de forme au d�but suivi de ses coordonn�es
		coordonneesSplit[0]  = type;
	}
	
	/**
	 * Fonction qui rempli le tableau complet a retourner.
	 * Ajoute le numero de sequence apres les coordonnees.
	 */
	private void remplir_infos(){
		
		infos_formes = new String[6];
		
		for(int i=0;i<coordonneesSplit.length;i++)
			infos_formes[i] = coordonneesSplit[i];
		
		//ajout du numero de sequence
		infos_formes[5] = nseq;
	}
	
}
